package facade;

import java.util.Date;
import java.util.List;

import org.junit.Test;

import psc.model.base.acesso.Cliente;
import psc.model.base.acesso.EnderecoEmb;
import psc.model.base.acesso.Perfil;
import psc.model.base.basicas.Banco;
import psc.model.base.basicas.Cidade;
import psc.model.base.basicas.Estado;
import psc.model.base.basicas.Profissao;
import psc.model.base.basicas.TipoConta;
import psc.model.base.basicas.TipoLiberacao;
import psc.model.base.cliente.Agencia;
import psc.model.base.cliente.Conta;
import psc.model.base.transacao.Boleto;
import psc.model.base.transacao.Liberacao;
import psc.model.dao.DaoFactory;
import psc.model.dao.acesso.DaoPerfil;
import psc.model.dao.basicas.DaoBanco;
import psc.model.dao.basicas.DaoCidade;
import psc.model.dao.basicas.DaoEstado;
import psc.model.dao.basicas.DaoProfissao;
import psc.model.dao.basicas.DaoTipoConta;
import psc.model.dao.basicas.DaoTipoLiberacao;
import psc.model.dao.cliente.DaoAgencia;
import psc.model.dao.cliente.DaoCliente;
import util.Constantes;
import util.ErroEasyBank;

public class FacadePagamentoTest {

	@Test
	public void testRealizarPagamento() {

		Liberacao liberacao = new Liberacao();
		liberacao.setAgencia(getAgenciaTeste());
		liberacao.setBanco(getBancoTeste());
		liberacao.setDataLiberacao(new Date());

		Conta conta2 = new Conta();
		conta2.setAgencia(getAgenciaTeste());
		conta2.setNumero(45778);
		conta2.setDigitoVerificador(7);
		conta2.setTipoConta(getTipoContaTeste());
		conta2.setCliente(getClienteTeste());

		FacadeConta facadeConta = new FacadeConta();
		try {

			facadeConta.inserirConta(conta2);
		} catch (ErroEasyBank e) {
			e.printStackTrace();
		}
		conta2 = facadeConta.consultarConta(conta2);

		Boleto boleto = new Boleto();
		boleto.setDataVencimento(new Date());
		boleto.setNumero(12333);
		boleto.setTipo(Constantes.tipoBoleto.cobranca);
		boleto.setValor(liberacao.getValor());
		liberacao.setConta(conta2);
		liberacao.setBoleto(boleto);
		liberacao.setTipoLiberacao(getTipoLiberacaoTeste());

		FacadePagamento facadePagamento = new FacadePagamento();

		liberacao.setValor(100);
		try {
			facadePagamento.realizarPagamento(liberacao);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private Banco getBancoTeste() {
		DaoBanco daoBanco = DaoFactory.getBancoDao();
		Banco banco = new Banco();
		banco.setDescricao("BANCO TESTE");
		banco.setCodigo(999);
		List<Banco> bancos = daoBanco.buscarPorExemplo(banco);

		if (bancos != null && bancos.size() > 0)
			return bancos.get(0);
		daoBanco.salvar(banco);
		return banco;
	}

	private Agencia getAgenciaTeste() {
		Agencia agencia = new Agencia();
		DaoAgencia daoAgencia = DaoFactory.getAgenciaDao();
		agencia.setNumero(1230);
		agencia.setBanco(getBancoTeste());

		EnderecoEmb endereco = new EnderecoEmb();
		endereco.setBairro("Curado IV");
		endereco.setCep(54270090);
		endereco.setNumero(28);
		endereco.setUf(getEstado());
		endereco.setCidade(getCidade());
		endereco.setLogradouro("Avenida 01");
		agencia.setEndereco(endereco);

		List<Agencia> agencias = daoAgencia.buscarPorExemplo(agencia);
		if (agencias != null && agencias.size() > 0)
			return agencias.get(0);

		daoAgencia.salvar(agencia);
		return agencia;
	}

	private Estado getEstado() {
		DaoEstado daoEstado = DaoFactory.getEstadoDao();
		Estado estado = new Estado();
		estado.setNome("PERNAMBUCO");
		estado.setSigla("PE");
		List<Estado> estados = daoEstado.buscarPorExemplo(estado);
		if (estados != null && estados.size() > 0)
			return estados.get(0);
		daoEstado.salvar(estado);
		return estado;
	}

	private Cidade getCidade() {
		DaoCidade daoCidade = DaoFactory.getCidadeDao();
		Cidade cidade = new Cidade();
		cidade.setNome("RECIFE");
		cidade.setEstado(getEstado());
		List<Cidade> cidades = daoCidade.buscarPorExemplo(cidade);
		if (cidades != null && cidades.size() > 0)
			return cidades.get(0);
		daoCidade.salvar(cidade);
		return cidade;
	}

	private Cliente getClienteTeste() {
		DaoCliente daoCliente = DaoFactory.getClienteDao();
		Cliente cliente = new Cliente();
		cliente.setNome("Teste");
		cliente.setCpf("867.861.452-80");
		cliente.setDataInclusao(new Date());
		cliente.setEmail("teste@easybank.com");
		cliente.setEstadoCivil("SOLTEIRO");
		cliente.setNomeMae("MARIA TESTE");
		cliente.setNomePai("JOSE TESTE");
		cliente.setSexo(Constantes.sexo.Masculino);
		cliente.setLogin("teste");
		cliente.setSenha("teste");
		cliente.setRenda(2500);
		@SuppressWarnings("deprecation")
		Date date = new Date(6, 3, 1991);
		cliente.setDataNascimento(date);
		cliente.setNomeConjuge("RENATA TESTE");
		cliente.setProfissao(getProfissaoTeste());
		cliente.setPerfil(getPerfilTeste());
		List<Cliente> clientes = daoCliente.buscarPorExemplo(cliente);
		if (clientes != null && clientes.size() > 0)
			return clientes.get(0);
		daoCliente.salvar(cliente);
		return cliente;
	}

	private Profissao getProfissaoTeste() {
		DaoProfissao daoProfissao = DaoFactory.getProfissaoDao();
		Profissao profissao = new Profissao();
		profissao.setDescricao("TESTE");
		List<Profissao> perfis = daoProfissao.buscarPorExemplo(profissao);
		if (perfis != null && perfis.size() > 0)
			return perfis.get(0);
		daoProfissao.salvar(profissao);
		return profissao;
	}

	private Perfil getPerfilTeste() {
		DaoPerfil daoPerfil = DaoFactory.getPerfilDao();
		Perfil perfil = new Perfil();
		perfil.setDescricao("TESTE");
		List<Perfil> perfis = daoPerfil.buscarPorExemplo(perfil);
		if (perfis != null && perfis.size() > 0)
			return perfis.get(0);
		daoPerfil.salvar(perfil);
		return perfil;
	}

	private TipoConta getTipoContaTeste() {
		DaoTipoConta daoTipoConta = DaoFactory.getTipoContaDao();
		TipoConta tipoConta = new TipoConta();
		tipoConta.setDescricao("CONTA CORRENTE");
		List<TipoConta> tiposConta = daoTipoConta.buscarPorExemplo(tipoConta);
		if (tiposConta != null && tiposConta.size() > 0)
			return tiposConta.get(0);
		daoTipoConta.salvar(tipoConta);
		return tipoConta;
	}

	private TipoLiberacao getTipoLiberacaoTeste() {
		DaoTipoLiberacao daoTipoLiberacao = DaoFactory.getTipoLiberacaoDao();
		TipoLiberacao tipoLiberacao = new TipoLiberacao();
		tipoLiberacao.setDescricao("PAGAMENTO");
		List<TipoLiberacao> tiposLiberacao = daoTipoLiberacao
				.buscarPorExemplo(tipoLiberacao);
		if (tiposLiberacao != null && tiposLiberacao.size() > 0)
			return tiposLiberacao.get(0);
		daoTipoLiberacao.salvar(tipoLiberacao);
		return tipoLiberacao;
	}

}
